﻿#include "Sistema.h"
#include "Ciudad.h"
#include "Atraccion.h"
#include "TablaAVL.h"
#include "ComparadorClave.h"
#include "TablaHashA.h" 
#include "FuncionHash.h" 
#include "CadenaFuncionHash.h" 

Sistema::Sistema(nat VELOCIDAD_OMNIBUS, nat VELOCIDAD_AVION, nat COSTO_OMNIBUS, nat COSTO_AVION, nat CAPACIDAD_OMNIBUS, nat CAPACIDAD_AVION, nat MAX_CIUDADES, nat MAX_EXCURSIONES)
{
	this->maxCiudades = MAX_CIUDADES;
	this->cantCiudades = 0;
	this->maxExcursiones = MAX_EXCURSIONES;
	this->cantExcursiones = 0;
	Puntero<Comparador<Cadena>> compClave = new ComparadorClave<Cadena>();
	this->ciudadesPorNombre = new TablaAVL<Cadena, Puntero<ICiudad>>(compClave);
	Puntero<FuncionHash<Cadena>> funcionCadena= new  CadenaFuncionHash();
	this->tablaHashAtraccion = new TablaHashA<Cadena, Puntero<IAtraccion>>(compClave, funcionCadena, this->maxCiudades);
}

Sistema::~Sistema()
{
}
// Hito de Control Tipo 1

TipoRetorno Sistema::IngresoCiudad(Cadena nombre)
{
	/*Sobrepasa la cantidad maxima de ciudades permitidas*/
	if(this->cantCiudades == this->maxCiudades){
		return ERROR;
	}

	/*creo persona*/
	Puntero<ICiudad> ciudad = new Ciudad(nombre);
	this->ciudadesPorNombre->Agregar(nombre, ciudad);
	
	this->cantCiudades++;

	return OK;
}

TipoRetorno Sistema::IngresoAtraccion(Cadena identificador, Cadena nombre, nat horarioInicio, nat horarioFin, Cadena nombreCiudad, nat precio)
{
	/*Puntero<IAtraccion> atraccion = new Atraccion();
	
	this->tablaHashAtraccion->Agregar(nombre, atraccion);*/

	return OK;


}

TipoRetorno Sistema::CalificarAtraccion(nat fechaCalificacion, Cadena idAtraccion, int calificacion, Cadena comentarios)
{
	return NO_IMPLEMENTADA;
}

TipoRetorno Sistema::AltaConexion(Cadena ciudadOrigen, Cadena ciudadDestino, nat distancia, nat omnibus, nat aviones)
{
	return NO_IMPLEMENTADA;
}

Tupla<TipoRetorno, pAtraccion> Sistema::ConsultaAtraccion(Cadena idAtraccion)
{
	return Tupla<TipoRetorno, pAtraccion>(NO_IMPLEMENTADA, NULL);
}

Tupla<TipoRetorno, Iterador<Tupla<Cadena, Cadena, TipoTransporte, nat>>> Sistema::Transportes()
{
	return Tupla<TipoRetorno, Iterador<Tupla<Cadena, Cadena, TipoTransporte, nat>>>(NO_IMPLEMENTADA, NULL);
}

// Entrega final Tipo 1

Tupla<TipoRetorno, pCiudad> Sistema::CiudadMejoresAtracciones()
{
	return Tupla<TipoRetorno, pCiudad>(NO_IMPLEMENTADA, NULL);
}

TipoRetorno Sistema::IngresoExcursionItinerario(nat nroExcursion, nat fecha, Iterador<Cadena> itinerario)
{
	return NO_IMPLEMENTADA;
}

TipoRetorno Sistema::IngresoExcursionDistancia(nat nroExcursion, nat fecha, nat tiempoMax, Cadena ciudadOrigen, Cadena ciudadDestino, Iterador<Cadena> ciudadesNoDeseadas)
{
	return NO_IMPLEMENTADA;
}

TipoRetorno Sistema::IngresoExcursionCosto(nat nroExcursion, nat fecha, Cadena ciudadOrigen, Cadena ciudadDestino)
{
	return NO_IMPLEMENTADA;
}

Tupla<TipoRetorno, pExcursion> Sistema::ConsultaExcursion(nat nroExcursion)
{
	return Tupla<TipoRetorno, pExcursion>(NO_IMPLEMENTADA, NULL);
}

Tupla<TipoRetorno, Iterador<pCiudad>> Sistema::ListadoCiudades()
{
	return Tupla<TipoRetorno, Iterador<pCiudad>>(NO_IMPLEMENTADA, NULL);
}

// Entrega final Tipo 2

Tupla<TipoRetorno, bool> Sistema::HayCamino(Cadena ciudadOrigen, Cadena ciudadDestino)
{
	return Tupla<TipoRetorno, bool>(NO_IMPLEMENTADA, false);
}

Tupla<TipoRetorno, Iterador<pAtraccion>> Sistema::AtraccionesAVisitarA(nat nroExcursion, nat dineroMax)
{
	return Tupla<TipoRetorno, Iterador<pAtraccion>>(NO_IMPLEMENTADA, NULL);
}

Tupla<TipoRetorno, Iterador<pAtraccion>> Sistema::AtraccionesAVisitarB(nat nroExcursion, nat dineroMax)
{
	return Tupla<TipoRetorno, Iterador<pAtraccion>>(NO_IMPLEMENTADA, NULL);
}

Tupla<TipoRetorno, nat> Sistema::MaximosViajantes(Cadena ciudadOrigen, Cadena ciudadDestino)
{
	return Tupla<TipoRetorno, nat>(NO_IMPLEMENTADA, 0);
}

// Operaciones opcionales

Tupla<TipoRetorno, Iterador<pCiudad>> Sistema::CiudadesEsenciales(Cadena ciudadOrigen, Cadena ciudadDestino, TipoTransporte tipoTransporte)
{
	return Tupla<TipoRetorno, Iterador<pCiudad>>(NO_IMPLEMENTADA, NULL);
}
